package paint;

/**
 * La classe Segment sert à la création d'un segment
 * @author Romain Bustos
 * @author Matthieu Perrin
 * @version 1.0
 */
public class Segment extends Forme {
    private Point a;
    private Point b;
    
    /**
    *<b>Constructeur par defaut de la classe Segment</b><br> 
    * <p>
    * Est utilisé lors d'une construction sans arguements d'un Segment <br>
    * a = new Point() <br>
    * b = new Point() <br>
    * </p>
    */
    public Segment(){
        a = new Point();
        b = new Point();
    }
    
    /**
    *<b>Constructeur canonique de la classe Segment</b><br> 
    * <p>
    * Est utilisé lors de la construction d'un Segment <br>
    * </p>
    */
    public Segment(Point x, Point y){
        a = x.createClone();
        b = y.createClone();
    }

    /**
    *<b>Constructeur secondaire de la classe Segment</b><br> 
    * <p>
    * Est utilisé pour créer la symetrie par rapport à l'origine du segment courant<br>
    * </p>
    * @return Segment symétrique par rapport à l'origine
    */
    public Segment createSymetrieO(){
        return new Segment(this.a.createSymetrieO(), this.b.createSymetrieO());
    }
    
    /**
    *<b>Constructeur secondaire de la classe Segment</b><br> 
    * <p>
    * Est utilisé pour créer la symetrie par rapport à X du segment courant<br>
    * </p>
    * @return Segment symétrique par rapport à X
    */
    public Segment createSymetrieX(){
        return new Segment(this.a.createSymetrieX(), this.b.createSymetrieX());
    }
    
    
    /**
    *<b>Constructeur secondaire de la classe Segment</b><br> 
    * <p>
    * Est utilisé pour créer la symetrie par rapport à Y du segment courant<br>
    * </p>
    * @return Segment symétrique par rapport à Y
    */
    public Segment createSymetrieY(){
        return new Segment(this.a.createSymetrieY(), this.b.createSymetrieY());
    }
    
    
    /**
    *<b>Constructeur secondaire de la classe Segment</b><br> 
    * <p>
    * Est utilisé pour créer le clone du segment courant<br>
    * </p>
    * @return Segment clone du segment courant
    */
    @Override
    public Segment createClone(){
        return new Segment(this.a.createClone(), this.b.createClone());
    }

    /**
    *<b>Observateur de la classe Segment</b><br> 
    * <p>
    * Est utilisé pour recupérer le point A d'un segment<br>
    * </p>
    * @return Point A du segment courant
    */
    public Point getA() {
        return a;
    }

    /**
    *<b>Observateur de la classe Segment</b><br> 
    * <p>
    * Est utilisé pour recupérer le point B d'un segment<br>
    * </p>
    * @return Point B du segment courant
    */
    public Point getB() {
        return b;
    }

    /**
    *<b>Mutateur de la classe Segment</b><br> 
    * <p>
    * Est utilisé pour modifier la valeur A du Segment courant<br>
    * </p>
    * @param a
    *       nouvelle valeur de point A
    */
    public void setA(Point a) {
        this.a = a.createClone();
    }

    /**
    *<b>Mutateur de la classe Segment</b><br> 
    * <p>
    * Est utilisé pour modifier la valeur B du Segment courant<br>
    * </p>
    * @param b
    *       nouvelle valeur de point B
    */
    public void setB(Point b) {
        this.b = b.createClone();
    }
    
    
    
    /**
    *<b>Observateur de la classe Segment</b><br> 
    * <p>
    * Est utilisé pour donner un aperçu d'un segment sous forme de texte<br>
    * </p>
    * @return détail d'un segment
    */
    @Override
    public String toString(){
        return "Point A: " + this.a + " Point B: " + this.b;
    }
    
    
    /**
    *<b>Observateur de la classe Segment</b><br> 
    * <p>
    * Est utilisé pour savoir si deux objet de type Segment sont égaux<br>
    * </p>
    * @param S1
    *       Segment de comparaison
    * @return boolean => Vrai / Faux
    */
    public boolean equals(Segment S1){
        return (this.a.equals(S1.a) && this.b.equals(S1.b));
    }
    
    /**
    *<b>Methode de la classe Segment</b><br> 
    * <p>
    * Connaitre la longueur d'un segment<br>
    * </p>
    * @return distance d'un segment
    */
    public double distance(){
        return this.a.distance(b);
    } 
}
